import Vue from 'vue'
import VueRouter from 'vue-router'

import routes from './routes'

Vue.use(VueRouter);

// 引入store
import store from '@/store'

// 先把VueRouter原型对象的push保存
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
// 重写push|replace
// 第一个参数：告诉原本push方法 往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(this, location, () => { }, () => { })
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace.call(this, location, () => { }, () => { })
  }
}

let router = new VueRouter({
  routes,
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  },
});

// 全局守卫：前置守卫
router.beforeEach(async (to, from, next) => {
  // next();
  // 用户登录了才会有token
  let token = store.state.user.token;
  // 用户信息
  let name = store.state.user.userInfo.name;
  // 已经登录了
  if (token) {
    // 不能去login
    if (to.path == '/login') {
      next('/')
    } else {
      // 登录了 去的不是login
      // 如果已经有用户名
      if (name) {
        next();
      } else {
        // 没有用户信息 派发action让仓库存储用户信息再跳转
        try {
          // 获取用户信息成功
          await store.dispatch("getUserInfo");
          next();
        } catch (error) {
          // token失效了获取不到用户信息
          // 清除token
          await store.dispatch('userLogout');
          next('/login')
        }
      }
    }
  } else {
    let toPath = to.path;
    // 未登录：不能去交易相关页面 不能去支付相关页面 不能去个人中心
    if (toPath.indexOf('/trade') !== -1 || toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1) {
      // 把未登录的时候想去没去成的信息 存储在地址栏中
      next('/login?redirect=' + toPath)
    } else {
      // 去的不是上面这些路由 直接放行
      next();
    }
  }
})

export default router;